Mac 环境编译 OpenJDK11 记录

前言

今天学习怎么自己编译 OpenJDK,选择了 LTS 的 jdk11 版本。动机是之前学习了一个大佬的修 Bug 过程,其中用到了自己编译的 JDK 来输出原本 JDK 不会输出的报错信息,于是今天学习一下以作积累。

前期工作

系统环境:macOS Catalina 10.15.2

  1. 安装 Xcode 和 Command line tools,只有 Command line tools 是不够的,不安装的话报错信息记录在见下文编译过程:

    1
    2
    # 安装 Command line tools
    xcode-select --install
  2. 安装 Homebrew,然后安装 OpenJDK 的依赖 freetype,安装 ccache 提升编译速度:

    1
    2
    3
    4
    5
    6
    # 安装 Homebrew
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    # 安装依赖
    brew install autoconf
    brew install freetype
    brew install ccache
  3. 安装 XQuartz。X11 是 Unix 类 OS 使用的图形系统,10.8 以前的 OS X 是自带的,但是从此以后就不自带了。对应于 Mac,你需要装 XQuartz,这个没有版本限制,去网上下最新版即可。装这个的原因是当时在编译 PolicyTools 的时候出现了如下错误:

    1
    ld: library not found for -lX11

编译过程

  1. 下载 OpenJDK11 源码 http://jdk.java.net/,选择 11 版本:

    image-20200105152554733

  2. 运行自带的 configure,注意这里需要一个 Bootstrap JDK,如果需要编译版本为 N 的OpenJDK,那么 Bootstrap JDK 的版本应不低于 N-1,注意一定要带上 --disable-warnings-as-errors,不然会把警告当做错误就无法继续编译了:

    1
    bash ./configure --with-debug-level=slowdebug --with-boot-jdk=/Library/Java/JavaVirtualMachines/jdk-11.0.5.jdk/Contents/Home --with-target-bits=64 --enable-ccache --disable-warnings-as-errors --with-boot-jdk-jvmargs="-Xlint:deprecation -Xlint:unchecked"

    配置成功信息:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    A new configuration has been successfully created in
    /Users/Ryan/code/c/openjdk11/build/macosx-x86_64-normal-server-slowdebug
    using configure arguments '--with-debug-level=slowdebug --with-boot-jdk=/Library/Java/JavaVirtualMachines/jdk-11.0.5.jdk/Contents/Home --with-target-bits=64 --enable-ccache --disable-warnings-as-errors --with-boot-jdk-jvmargs='-Xlint:deprecation -Xlint:unchecked''.

    Configuration summary:
    * Debug level: slowdebug
    * HS debug level: debug
    * JVM variants: server
    * JVM features: server: 'aot cds cmsgc compiler1 compiler2 dtrace epsilongc g1gc graal jfr jni-check jvmci jvmti management nmt parallelgc serialgc services vm-structs'
    * OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64
    * Version string: 11-internal+0-adhoc.ryan.openjdk11 (11-internal)

    Tools summary:
    * Boot JDK: java version "11.0.5" 2019-10-15 LTS Java(TM) SE Runtime Environment 18.9 (build 11.0.5+10-LTS) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.5+10-LTS, mixed mode) (at /Library/Java/JavaVirtualMachines/jdk-11.0.5.jdk/Contents/Home)
    * Toolchain: clang (clang/LLVM from Xcode 11.3)
    * C Compiler: Version 11.0.0 (at /usr/bin/clang)
    * C++ Compiler: Version 11.0.0 (at /usr/bin/g++)

    Build performance summary:
    * Cores to use: 8
    * Memory limit: 16384 MB
    * ccache status: Active (3.7.5)
  1. 开始编译:make all

    (以下这个问题在编译 OpenJDK8 时候遇到,由于编译 OpenJDK11 的时候这些文件已经加上,所以不确定会不会引起这个问题)

    Xcode10 移除了GCC的 stdc++,于是遇到问题:

    1
    2
    > error: include path for stdlibc++ headers not found; pass ‘-std=libc++’ on the command line to use the libc++ standard library instead
    >

    把编译命令改成:make all -stdlib=libc++,还是失败……最后还是从网上搞来了 Xcode 9 中的相关文件,放入到 Xcode 文件夹的相同路径:https://segmentfault.com/q/1010000017752615

    完成编译:

    1
    2
    Creating jdk image
    Finished building target 'all' in configuration 'macosx-x86_64-normal-server-slowdebug'

我用了 jenv 来管理 Java 版本,将编译好的 OpenJDK11 加入到 jenv 中:

1
jenv add /Users/Ryan/code/c/openjdk11/build/macosx-x86_64-normal-server-slowdebug/jdk

然后切换到 OpenJDK:

1
jenv local openjdk64-11-internal

查看 Java 版本 java -version

1
2
3
openjdk version "11-internal" 2018-09-25
OpenJDK Runtime Environment (slowdebug build 11-internal+0-adhoc.ryan.openjdk11)
OpenJDK 64-Bit Server VM (slowdebug build 11-internal+0-adhoc.ryan.openjdk11, mixed mode)

达到预期效果,编译成功。

后续更新使用自己编译的 OpenJDK 进行 Debug 的方法~

0%